import { createRouter, createWebHistory } from 'vue-router'
import { ElMessage } from 'element-plus'
import Logger from '~/utils/logger'
import Token from '~/utils/token'
import { useAppStore } from '~/stores/app'
import { publicRoutes } from './public_routes'
import pathTable, { needLoginPaths, needLoginAndPermissionPaths } from './path_table'
import { canAccessRoute } from './dynamic_routing'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL), // 若为 '/haha'，此时 http://ip:port/login 会重定向为 http://ip:port/haha/login
  routes: publicRoutes
})

/**
 * 路由前置守卫：每次路由切换时先执行的操作
 * @param {*} to   要到哪里去
 * @param {*} from 从哪里来
 * @param {*} next 是否要去？
 */
router.beforeEach((to, from, next) => {
  Logger.log('路由前置守卫程序 ' + from.path + ' ---> ' + to.path, '')
  if (needLoginPaths.indexOf(to.path) < 0) {
    // 分支1: 访问白名单路径（不需要登录即可访问）
    Logger.log('访问白名单页面')
    if (
      (to.path === pathTable.PORTAL ||
        to.path === pathTable.LOGIN ||
        to.path === pathTable.REGISTER ||
        to.path === pathTable.RESET_PASSWORD) &&
      Token.hasToken() &&
      !Token.isExpired()
    ) {
      Logger.log('用户已登录，不允许访问门户页面，重定向到主页')
      next(pathTable.INDEX)
    } else {
      // 其他非门户的白名单页面不论登录与否均可访问
      next()
    }
  } else {
    // 分支2: 访问非白名单路径，须先登录，否则重定向到登录页面
    Logger.log('访问非白名单页面')
    if (Token.hasToken() && !Token.isExpired()) {
      Logger.log('用户已登录，token未过期')
      if (needLoginAndPermissionPaths.indexOf(to.path) > 0 && !canAccessRoute(to.name)) {
        Logger.log('用户无权限访问此非白名单页面，跳转到401页面')
        next(pathTable.NOT_AUTHORIZED_EMBEDDED)
        return
      }
      Logger.log('用户允许访问该非白名单页面')
      next()
    } else {
      Logger.log('用户token不存在或已过期，重定向到登录页面')
      if (!Token.hasToken()) {
        ElMessage.error('用户未登录')
      } else {
        ElMessage.error('登录已过期，请重新登录')
      }
      useAppStore().initializeApp()
      next(pathTable.LOGIN)
    }
  }
})

export default router
